package com.fowo.api.documentCirculation.sql;

import java.util.List;

/**
 * SQL 语法处理器
 * @author yl_ls
 */
public interface ISqlHandler {
    /**
     * 将 SqlBuilder 表示的查询处理为目标数据库的查询与参数
     * @param sqlBuilder 查询构建器
     * @return 查询与参数
     * @throws Exception 处理错误
     */
    SqlAndArgs getSql(SqlBuilder sqlBuilder) throws Exception;

    /**
     * 将 SqlBuilder 表示的查询处理为目标数据库的查询与参数
     * @param sqlBuilder 查询构建器，返回结果集大小
     * @return 查询与参数
     * @throws Exception 处理错误
     */
    SqlAndArgs getCountSql(SqlBuilder sqlBuilder) throws Exception;


    /**
     * 将 SqlBuilder 表示的查询处理为目标数据库的统计类查询与参数
     * @param sqlBuilder 查询构建器，返回结果集大小
     * @return 查询与参数
     * @throws Exception 处理错误
     */
    SqlAndArgs getStatisticsSql(SqlBuilder sqlBuilder, List<SqlBuilder.StatisticsColumn> columns) throws Exception;

    /**
     * 将 SqlBuilder 表示的查询处理为目标数据库的查询与参数
     * @param sqlBuilder 查询构建器，返回结果是否存在
     * @return 查询与参数
     * @throws Exception 处理错误
     */
    SqlAndArgs getSelectExistsSql(SqlBuilder sqlBuilder) throws Exception;

    /**
     * 获取此数据源的查询最新生成自增标识的语句
     * @return 查询最新生成自增标识的语句
     */
    String getNewIdentitySql();

    /**
     * 获取此数据源的三元表达式函数写法
     * @param conditionExp 条件表达式
     * @param trueExp 真值表达式
     * @param falseExp 假值表达式
     * @return 三元表达式函数写法
     */
    String funcIf(String conditionExp, String trueExp, String falseExp);

    /**
     * 获取此数据源的空值条件函数写法
     * @param valueExp 原值表达式
     * @param nullExp 原值表达式为空时的表达式
     * @return 空值条件函数写法
     */
    String funcIfNull(String valueExp, String nullExp);
}
